package com.mxs.qrcode.utils.alisms;

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import com.google.gson.Gson;

public class AliSmsSendUtils {

    /**
     * 支持在一次请求中向多个不同的手机号码发送同样内容的短信。
     * @param client 必填
     * @param phoneNumbers
     *          国内短信：+/+86/0086/86或无任何前缀的11位手机号码，例如1381111****。
     *          国际/港澳台消息：国际区号+号码，例如852000012****。
     *          支持对多个手机号码发送短信，手机号码之间以英文逗号（,）分隔。上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。
     * @param signName 短信签名名称。必须是已添加、并通过审核的短信签名。请在控制台国内消息或国际/港澳台消息页面中的签名管理页签下签名名称一列查看
     * @param TemplateCode 短信模板ID。必须是已添加、并通过审核的短信签名；且发送国际/港澳台消息时，请使用国际/港澳台短信模版。
     * @return
     */
    public static boolean sendSms(Client client,String phoneNumbers ,String signName,String TemplateCode) throws Exception {
        return sendSms(client, phoneNumbers, signName, TemplateCode, null,null,null);
    }


    /**
     * 支持在一次请求中向多个不同的手机号码发送同样内容的短信。
     * @param client 必填
     * @param phoneNumbers
     *          国内短信：+/+86/0086/86或无任何前缀的11位手机号码，例如1381111****。
     *          国际/港澳台消息：国际区号+号码，例如852000012****。
     *          支持对多个手机号码发送短信，手机号码之间以英文逗号（,）分隔。上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。
     * @param signName 短信签名名称。必须是已添加、并通过审核的短信签名。请在控制台国内消息或国际/港澳台消息页面中的签名管理页签下签名名称一列查看
     * @param TemplateCode 短信模板ID。必须是已添加、并通过审核的短信签名；且发送国际/港澳台消息时，请使用国际/港澳台短信模版。
     * @param TemplateParam 短信模板变量对应的实际值，JSON格式。
     * @return
     */
    public static boolean sendSms(Client client,String phoneNumbers ,String signName,String TemplateCode,String TemplateParam) throws Exception {
        return sendSms(client, phoneNumbers, signName, TemplateCode, TemplateParam,null,null);
    }

    /**
     * 支持在一次请求中向多个不同的手机号码发送同样内容的短信。
     * @param client 必填
     * @param phoneNumbers 必填
     *          国内短信：+/+86/0086/86或无任何前缀的11位手机号码，例如1381111****。
     *          国际/港澳台消息：国际区号+号码，例如852000012****。
     *          支持对多个手机号码发送短信，手机号码之间以英文逗号（,）分隔。上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。
     * @param signName 必填 短信签名名称。必须是已添加、并通过审核的短信签名。请在控制台国内消息或国际/港澳台消息页面中的签名管理页签下签名名称一列查看
     * @param TemplateCode 必填 短信模板ID。必须是已添加、并通过审核的短信签名；且发送国际/港澳台消息时，请使用国际/港澳台短信模版。
     * @param TemplateParam 短信模板变量对应的实际值，JSON格式。
     * @param SmsUpExtendCode
     *          上行短信扩展码，上行短信，指发送给通信服务提供商的短信，用于定制某种服务、完成查询，或是办理某种业务等，需要收费的，按运营商普通短信资费进行扣费。
     *          无特殊需要此字段的用户请忽略此字段。
     * @param OutId 外部流水扩展字段。
     *
     * @return
     */
    public static boolean sendSms(Client client,String phoneNumbers ,String signName,String TemplateCode,String TemplateParam,
                           String SmsUpExtendCode,String OutId) throws Exception {


        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(phoneNumbers)
                .setSignName(signName)
                .setTemplateCode(TemplateCode)
                .setTemplateParam(TemplateParam)
                .setSmsUpExtendCode(SmsUpExtendCode)
                .setOutId(OutId);
        SendSmsResponse response = client.sendSms(sendSmsRequest);
        SendSmsResponseBody body = response.getBody();

        if(AliSmsCode.OK_CODE.equals(body.getCode())){
            return true;
        }else{
            Gson gson = new Gson();
            String jsonStr = gson.toJson(body);
            System.err.println(jsonStr);
            try {
                throw new Exception(jsonStr);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                return false;
            }
        }
    }


    /**
     * 支持在一次请求中分别向多个不同的手机号码发送不同签名的短信
     * @param client
     * @param phoneNumbers
     * @param signNames 短信签名的个数必须与手机号码的个数相同、内容一一对应
     * @param TemplateCode 发送国际/港澳台消息时，请使用国际/港澳台短信模版
     * @param TemplateParams 模板变量值的个数必须与手机号码、签名的个数相同、内容一一对应
     * @param SmsUpExtendCodes  上行短信扩展码，JSON数组格式
     * @throws Exception
     * @return
     */
    public static boolean sendSms(Client client,String[] phoneNumbers ,String[] signNames,String TemplateCode,String[] TemplateParams,
                           String[] SmsUpExtendCodes) throws Exception {

        SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest()
                .setPhoneNumberJson(phoneNumbers.toString())
                .setSignNameJson(signNames.toString())
                .setTemplateCode(TemplateCode)
                .setTemplateParamJson(TemplateParams.toString());
        if(SmsUpExtendCodes != null && SmsUpExtendCodes.length >0 ){
                sendBatchSmsRequest.setSmsUpExtendCodeJson(SmsUpExtendCodes.toString());
        }
        SendBatchSmsResponse response = client.sendBatchSms(sendBatchSmsRequest);
        SendBatchSmsResponseBody body = response.getBody();

        if(AliSmsCode.OK_CODE.equals(body.getCode())){
            return true;
        }else{
            Gson gson = new Gson();
            String jsonStr = gson.toJson(body);
            System.err.println(jsonStr);
            try {
                throw new Exception(jsonStr);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                return false;
            }
        }
    }


}
